package Server;


import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Hashtable;
import java.util.List;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTabbedPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.border.EmptyBorder;
import javax.swing.JComboBox;
import org.gibello.zql.ZExpression;
import org.gibello.zql.ZGroupBy;

import javax.swing.ImageIcon;
import javax.swing.JCheckBox;

public class ServerGUI extends JFrame implements ActionListener {
	private JPanel contentPane;
	JPanel pnlDuLieu;
	private JTextField tfTenTruong; // TextField nhập tên trường
	private JComboBox<String> comboBoxKieuDuLieu; // ComboBox lựa chọn kiểu dữ
													// liệu (char, int)
	JTextArea taTruongHienTai; // Biến biểu diễn các trường và kiểu dữ liệu của
								// Trường hiện có trong bảng
	List<String> strTenTruong; // Biến biểu diễn tên các trường trong bảng
	List<String> strKieuDuLieu; // Biến biểu diễn các kiểu dữ liệu thuộc các
								// trường trong bảng
	List<Boolean> laKhoaChinh;
	List<Object[]> giaTriDuLieu; // Biến biểu diễn giá trị dữ liệu của bảng
	private int idClient; // Biến lưu ID của client gửi truy vấn
	private DanhSachBang cmboxDanhSachBang;
	private DanhSachClients listDanhSachClients;
	String strTenBang;
	JLabel lblTenBang;
	JTabbedPane tabbedPane;
	QuanLyBang quanLyBang = new QuanLyBang(); // Quản lý các bảng
	private JButton btnThemTruong;
	private JButton btnXoaTruong;
	private JButton btnHoanTat;
	private JButton btnHuyTaoBang;
	private JButton btnXemKetQua;
	private String luuDuongDan;

	// Giá trị trong comboBoxKieuDuLieu
	private String kieuInt = "int";
	private String kieuChuoi = "char";
	private JTextArea textAreaTrangThai;

	// Quản lý kế nối Server - Client
	private static SocketServer socketServer;

	// Parser câu lệnh SQL
	private MyParser myParser;
	private JLabel lblKhoaChinh;
	private JLabel lblDanhSachClients;
	private JLabel lblNhatKyKetNoi;
	private JButton btnDocTuFile;
	private JButton btnLuu;
	private JButton btnThemDong;
	private JButton btnXoaDong;
	private JButton btnXoaBang;
	private JCheckBox chckbxKhoaChinh;
	private JScrollPane scrollHienBang;
	private JLabel lblTrangThaiDuLieu;
	private JButton btnNgatKetNoi;

	/**
	 * Chạy ứng dụng
	 * 
	 * @throws IOException
	 */
	public static void main(String[] args) throws IOException {
		ServerGUI frame = new ServerGUI();
		WindowListener l = new WindowAdapter() {
			public void windowClosing(WindowEvent e) {
				System.exit(0);
			}
		};
		frame.addWindowListener(l);
		frame.setVisible(true);
		socketServer = new SocketServer(frame);
	}

	/**
	 * Tạo giao diện GUI
	 */
	public ServerGUI() {
		setTitle("Quản lý Server");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(400, 100, 784, 591);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(new GridLayout(1, 0, 0, 0));

		// tabbedPane chứa các tab
		tabbedPane = new JTabbedPane(JTabbedPane.TOP);
		contentPane.add(tabbedPane);

		// TAB QUẢN LÝ CLIENTS \\
		// Panel quản lý clients
		JPanel pnlQuanLyClient = new JPanel();
		tabbedPane.addTab("Quản lý Clients", null, pnlQuanLyClient, null);
		pnlQuanLyClient.setLayout(null);

		JScrollPane scrollPaneTrangThai = new JScrollPane();
		scrollPaneTrangThai.setBounds(366, 59, 385, 459);
		pnlQuanLyClient.add(scrollPaneTrangThai);

		setTextAreaTrangThai(new JTextArea("Chờ client kết nối...\n"));
		scrollPaneTrangThai.setViewportView(getTextAreaTrangThai());

		lblDanhSachClients = new JLabel("Danh sách Clients đang kết nối");
		lblDanhSachClients.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblDanhSachClients.setForeground(Color.BLUE);
		lblDanhSachClients.setBackground(Color.WHITE);
		lblDanhSachClients.setBounds(20, 23, 225, 21);
		pnlQuanLyClient.add(lblDanhSachClients);

		lblNhatKyKetNoi = new JLabel("Nhật ký kết nối");
		lblNhatKyKetNoi.setFont(new Font("Tahoma", Font.PLAIN, 14));
		lblNhatKyKetNoi.setForeground(Color.BLUE);
		lblNhatKyKetNoi.setBounds(384, 22, 225, 22);
		pnlQuanLyClient.add(lblNhatKyKetNoi);

		// list clients
		setListDanhSachClients(new DanhSachClients());
		JScrollPane listScrollPane = new JScrollPane(getListDanhSachClients()
				.getDanhSachClients());
		listScrollPane.setBounds(20, 60, 305, 386);
		listScrollPane.setBackground(Color.WHITE);
		pnlQuanLyClient.add(listScrollPane);

		btnNgatKetNoi = new JButton("");
		btnNgatKetNoi.setIcon(new ImageIcon(ServerGUI.class
				.getResource("/ImagesSource/rsz_disconnect.png")));
		btnNgatKetNoi
				.setToolTipText("Ngắt kết nối 1 client trong danh sách clients");
		btnNgatKetNoi.setBounds(269, 457, 56, 46);
		pnlQuanLyClient.add(btnNgatKetNoi);

		// TAB TẠO BẢNG \\
		JPanel pnlTaoBang = new JPanel();
		pnlTaoBang.setLayout(null);
		tabbedPane.addTab("Tạo bảng", null, pnlTaoBang, null);

		// label tiêu đề
		JLabel lblGiaoDienTaoBang = new JLabel("TẠO BẢNG");
		lblGiaoDienTaoBang.setBounds(303, 11, 167, 20);
		lblGiaoDienTaoBang.setHorizontalAlignment(SwingConstants.CENTER);
		lblGiaoDienTaoBang.setForeground(Color.BLUE);
		lblGiaoDienTaoBang.setBackground(Color.WHITE);
		lblGiaoDienTaoBang.setFont(new Font("Tahoma", Font.PLAIN, 16));
		pnlTaoBang.add(lblGiaoDienTaoBang);

		// label tên trường
		JLabel lblTenTruong = new JLabel("Tên trường");
		lblTenTruong.setBounds(545, 152, 86, 14);
		pnlTaoBang.add(lblTenTruong);

		// label kiểu dữ liệu
		JLabel lblKieuDuLieu = new JLabel("Kiểu dữ liệu:");
		lblKieuDuLieu.setBounds(545, 184, 97, 14);
		pnlTaoBang.add(lblKieuDuLieu);

		// label tên bảng
		lblTenBang = new JLabel("");
		lblTenBang.setFont(new Font("Tahoma", Font.PLAIN, 16));
		lblTenBang.setBounds(96, 40, 230, 22);
		pnlTaoBang.add(lblTenBang);

		// textfield nhập tên trường
		tfTenTruong = new JTextField();
		tfTenTruong.setEnabled(false);
		tfTenTruong.setBounds(635, 149, 116, 20);
		tfTenTruong.setColumns(10);
		tfTenTruong.setText("");
		pnlTaoBang.add(tfTenTruong);

		// textarea thông tin bảng
		taTruongHienTai = new JTextArea();
		taTruongHienTai.setEditable(false);
		taTruongHienTai.setBounds(10, 73, 500, 445);
		pnlTaoBang.add(taTruongHienTai);

		// button tạo bảng mới
		JButton btnTaoBangMoi = new JButton("");
		btnTaoBangMoi.setToolTipText("Tạo bảng mới");
		btnTaoBangMoi.setIcon(new ImageIcon(ServerGUI.class
				.getResource("/ImagesSource/rsz_newtable.png")));
		btnTaoBangMoi.setBounds(541, 73, 56, 46);
		pnlTaoBang.add(btnTaoBangMoi);

		// button hoàn tất quá trình tạo bảng
		btnHoanTat = new JButton("");
		btnHoanTat.setIcon(new ImageIcon(ServerGUI.class
				.getResource("/ImagesSource/rsz_ok.png")));
		btnHoanTat.setToolTipText("Hoàn tất");
		btnHoanTat.setEnabled(false);
		btnHoanTat.setBounds(541, 333, 56, 46);
		pnlTaoBang.add(btnHoanTat);

		// button hủy việc tạo bảng hiện tại
		btnHuyTaoBang = new JButton("");
		btnHuyTaoBang.setIcon(new ImageIcon(ServerGUI.class
				.getResource("/ImagesSource/rsz_cancel.png")));
		btnHuyTaoBang.setToolTipText("Hủy");
		btnHuyTaoBang.setEnabled(false);
		btnHuyTaoBang.setBounds(631, 333, 56, 46);
		pnlTaoBang.add(btnHuyTaoBang);

		// button thêm trường
		btnThemTruong = new JButton("");
		btnThemTruong.setIcon(new ImageIcon(ServerGUI.class
				.getResource("/ImagesSource/rsz_add.png")));
		btnThemTruong.setToolTipText("Thêm trường");
		btnThemTruong.setEnabled(false);
		btnThemTruong.setBounds(541, 264, 56, 46);
		pnlTaoBang.add(btnThemTruong);

		// button xóa trường
		btnXoaTruong = new JButton("");
		btnXoaTruong.setIcon(new ImageIcon(ServerGUI.class
				.getResource("/ImagesSource/rsz_remove.png")));
		btnXoaTruong.setToolTipText("Xóa trường");
		btnXoaTruong.setEnabled(false);
		btnXoaTruong.setBounds(631, 264, 56, 46);
		pnlTaoBang.add(btnXoaTruong);

		// button kết thúc
		btnXemKetQua = new JButton("");
		btnXemKetQua.setIcon(new ImageIcon(ServerGUI.class
				.getResource("/ImagesSource/rsz_viewresult.png")));
		btnXemKetQua.setToolTipText("Xem kết quả");
		btnXemKetQua.setBounds(633, 411, 56, 46);
		pnlTaoBang.add(btnXemKetQua);

		// button đọc file
		setBtnDocTuFile(new JButton(""));
		getBtnDocTuFile().setIcon(
				new ImageIcon(ServerGUI.class
						.getResource("/ImagesSource/rsz_openfile.png")));
		getBtnDocTuFile().setToolTipText("Đọc từ file ...");
		getBtnDocTuFile().setBounds(631, 73, 56, 46);
		pnlTaoBang.add(getBtnDocTuFile());

		// label Tên bảng hiện tại
		JLabel lblTB = new JLabel("Tên bảng : ");
		lblTB.setFont(new Font("Tahoma", Font.PLAIN, 16));
		lblTB.setBounds(10, 40, 86, 22);
		pnlTaoBang.add(lblTB);

		// comboBoxKieuDuLieu thể hiện kiểu dữ liệu của trường : int, char
		comboBoxKieuDuLieu = new JComboBox<String>();
		comboBoxKieuDuLieu.setEnabled(false);
		comboBoxKieuDuLieu.setBounds(635, 180, 116, 22);
		pnlTaoBang.add(comboBoxKieuDuLieu);

		// label Khóa chính
		lblKhoaChinh = new JLabel("Khóa chính :");
		lblKhoaChinh.setBounds(545, 209, 86, 14);
		pnlTaoBang.add(lblKhoaChinh);

		// check box khóa chính
		chckbxKhoaChinh = new JCheckBox("");
		chckbxKhoaChinh.setBounds(635, 205, 21, 23);
		pnlTaoBang.add(chckbxKhoaChinh);

		comboBoxKieuDuLieu.addItem(kieuInt);
		comboBoxKieuDuLieu.addItem(kieuChuoi);

		// button listener
		btnThemTruong.addActionListener(this);
		btnHoanTat.addActionListener(this);
		btnHuyTaoBang.addActionListener(this);
		btnTaoBangMoi.addActionListener(this);
		btnXemKetQua.addActionListener(this);
		btnXoaTruong.addActionListener(this);
		getBtnDocTuFile().addActionListener(this);
		btnThemTruong.setActionCommand("ThemTruong");
		btnHoanTat.setActionCommand("HoanTat");
		btnHuyTaoBang.setActionCommand("Huy");
		btnXemKetQua.setActionCommand("XemKetQua");
		btnTaoBangMoi.setActionCommand("TaoBangMoi");
		btnXoaTruong.setActionCommand("XoaTruong");
		getBtnDocTuFile().setActionCommand("DocCSDL");

		// TAB DỮ LIỆU\\
		// panel chính theo flow layout
		pnlDuLieu = new JPanel();
		pnlDuLieu.setToolTipText("");
		tabbedPane.addTab("D\u1EEF li\u1EC7u", null, pnlDuLieu, null);

		// button thêm 1 dòng mới vào cuối bảng
		btnThemDong = new JButton("");
		btnThemDong.setEnabled(false);
		btnThemDong.setIcon(new ImageIcon(ServerGUI.class
				.getResource("/ImagesSource/rsz_add.png")));
		btnThemDong.setToolTipText("Thêm dòng");
		btnThemDong.setBounds(629, 54, 56, 46);

		// button xóa 1 dòng ở cuối bảng
		btnXoaDong = new JButton("");
		btnXoaDong.setEnabled(false);
		btnXoaDong.setToolTipText("Xóa dòng");
		btnXoaDong.setIcon(new ImageIcon(ServerGUI.class
				.getResource("/ImagesSource/rsz_remove.png")));
		btnXoaDong.setBounds(695, 54, 56, 46);

		pnlDuLieu.setLayout(null);
		pnlDuLieu.add(btnThemDong);
		pnlDuLieu.add(btnXoaDong);

		// button xóa bảng
		btnXoaBang = new JButton("");
		btnXoaBang.setEnabled(false);
		btnXoaBang.setIcon(new ImageIcon(ServerGUI.class
				.getResource("/ImagesSource/rsz_cancel.png")));
		btnXoaBang.setToolTipText("Xóa bảng");
		btnXoaBang.setBounds(695, 125, 56, 46);
		pnlDuLieu.add(btnXoaBang);
		setBtnLuu(new JButton(""));
		pnlDuLieu.add(getBtnLuu());

		// combobox danh sách các table
		setCmboxDanhSachBang(new DanhSachBang());
		getCmboxDanhSachBang().setBounds(629, 11, 122, 32);
		pnlDuLieu.add(getCmboxDanhSachBang());

		setScrollHienBang(new JScrollPane());
		getScrollHienBang().setBounds(10, 11, 609, 480);
		getScrollHienBang().setPreferredSize(new Dimension(520, 300));
		pnlDuLieu.add(getScrollHienBang());

		getCmboxDanhSachBang().getDanhSachBang().setActionCommand("ChonBang");
		setLblTrangThaiDuLieu(new JLabel(""));
		getLblTrangThaiDuLieu().setBounds(10, 504, 294, 14);
		pnlDuLieu.add(getLblTrangThaiDuLieu());

		setLuuDuongDan("");
		getCmboxDanhSachBang().getDanhSachBang().addActionListener(this);
		btnThemDong.addActionListener(this);
		btnXoaDong.addActionListener(this);
		getBtnLuu().addActionListener(this);
		btnXoaBang.addActionListener(this);
		btnNgatKetNoi.addActionListener(this);

		// button command
		btnThemDong.setActionCommand("ThemDong");
		btnXoaDong.setActionCommand("XoaDongCuoi");
		getBtnLuu().setActionCommand("LuuCSDL");
		btnXoaBang.setActionCommand("XoaBang");
		btnNgatKetNoi.setActionCommand("NgatKetNoi");
	}

	/**
	 * Kiểm tra dòng dữ liệu cuối cùng có giá trị toàn NULL hay không
	 * 
	 * @return
	 */
	public boolean dongDuLieuNull() {
		MyTable myTable = quanLyBang.layBang(cmboxDanhSachBang
				.layBangDuocChon());
		int cot = myTable.laySoCot();
		int dong = myTable.laySoDong();
		if (cot == 0 || dong == 0)
			return false;

		String temp;
		for (int i = 0; i < cot; i++) {
			temp = myTable.layGiaTriDuLieuTaiViTri(dong - 1, i).toString();
			if (!temp.equalsIgnoreCase("NULL"))
				return false;
		}
		return true;
	}

	/**
	 * Xử lý các event
	 */
	@Override
	public void actionPerformed(ActionEvent e) {
		/**
		 * Xử lý khi thêm một dòng dữ liệu mới vào bảng
		 */
		if (e.getActionCommand().equals("ThemDong")) {
			if (dongDuLieuNull()) {
				JOptionPane.showMessageDialog(this,
						"Không thể thêm 2 dòng dữ liệu NULL liên tiếp",
						"Lưu ý", JOptionPane.WARNING_MESSAGE);
			} else {
				MyTable myTable = quanLyBang.layBang(cmboxDanhSachBang
						.layBangDuocChon());
				Object[] obj = new Object[myTable.laySoCot()];

				// Giá trị ban đầu của dữ liệu đều là NULL
				for (int i = 0; i < myTable.laySoCot(); i++) {
					obj[i] = "NULL";
				}
				myTable.themDong(obj);
				myTable.repaint();
			}
		}

		/**
		 * Xử lý khi xóa 1 dòng (dòng cuối) trong bảng
		 */
		if (e.getActionCommand().equals("XoaDongCuoi")) {
			MyTable myTable = quanLyBang.layBang(getCmboxDanhSachBang()
					.layBangDuocChon());
			myTable.xoaDongCuoi();
			myTable.repaint();
		}

		/**
		 * Xử lý khi chọn một bảng từ danh sách bảng
		 */
		if (e.getActionCommand().equals("ChonBang")) {
			int viTriBangDuocChon = cmboxDanhSachBang.layBangDuocChon();
			if (viTriBangDuocChon == -1) // ko còn bảng nào trong list
			{
				scrollHienBang.setViewportView(null);
				scrollHienBang.validate();
				return;
			}
			quanLyBang.veBang(this, viTriBangDuocChon);
		}

		/**
		 * Xử lý khi tạo một bảng mới
		 */
		if (e.getActionCommand().equals("TaoBangMoi")) {
			strTenBang = (String) JOptionPane.showInputDialog(this, null,
					"Nhập tên bảng", JOptionPane.PLAIN_MESSAGE, null, null,
					null);
			if (strTenBang == "" || strTenBang == null)
				return;
			strTenTruong = new ArrayList<String>();
			strKieuDuLieu = new ArrayList<String>();
			laKhoaChinh = new ArrayList<Boolean>();
			giaTriDuLieu = new ArrayList<Object[]>();
			taTruongHienTai.setText("");
			lblTenBang.setText(strTenBang);

			hienCacNut();
		}

		/**
		 * Xử lý khi xóa trường
		 */
		if (e.getActionCommand().equals("XoaTruong")) {
			if (!strTenTruong.isEmpty() && !strKieuDuLieu.isEmpty()) {
				strTenTruong.remove(strTenTruong.size() - 1);
				strKieuDuLieu.remove(strKieuDuLieu.size() - 1);
				String resultTable = "";
				for (int i = 0; i < strTenTruong.size(); i++) {
					resultTable += strTenTruong.get(i) + " "
							+ strKieuDuLieu.get(i) + " ,\n";
				}
				taTruongHienTai.setText(resultTable);
			}
		}

		/**
		 * Xử lý khi xóa bảng
		 */
		if (e.getActionCommand().equals("XoaBang")) {
			int temp = cmboxDanhSachBang.layBangDuocChon();
			quanLyBang.xoaBang(temp);
			cmboxDanhSachBang.xoaBang(temp);
			if (cmboxDanhSachBang.danhSachRong())
				anNutDuLieu();
		}

		/**
		 * Xử lý khi thêm trường mới
		 */
		if (e.getActionCommand().equals("ThemTruong")) {
			String tempLaKhoaChinh = "Khóa chính: ";

			if (!tfTenTruong.getText().isEmpty()) {
				tfTenTruong.setBackground(Color.WHITE);

				strTenTruong.add(this.tfTenTruong.getText());
				strKieuDuLieu.add(this.comboBoxKieuDuLieu.getSelectedItem()
						.toString());
				if (chckbxKhoaChinh.isSelected()) {
					laKhoaChinh.add(true);
					tempLaKhoaChinh += "true";
				} else {
					laKhoaChinh.add(false);
					tempLaKhoaChinh += "false";
				}

				String resultTable = "";
				resultTable += strTenTruong.get(strTenTruong.size() - 1) + " "
						+ strKieuDuLieu.get(strKieuDuLieu.size() - 1) + " "
						+ tempLaKhoaChinh + " ,\n";
				taTruongHienTai.append(resultTable);
			} else {
				JOptionPane.showMessageDialog(this,
						"Tên trường không được rỗng", "Lưu ý",
						JOptionPane.WARNING_MESSAGE);
				tfTenTruong.setBackground(Color.PINK);
			}
		}

		/**
		 * Xử lý khi hoàn tất việc thêm một bảng vào danh sách bảng
		 */
		if (e.getActionCommand().equals("HoanTat")) {
			if (!strTenTruong.isEmpty()) {
				MyTable myTable = new MyTable(450, 100, giaTriDuLieu,
						strTenTruong, strKieuDuLieu, strTenBang, laKhoaChinh);
				myTable.setOpaque(true);
				quanLyBang.themBang(myTable);
				cmboxDanhSachBang.themBang(strTenBang);
				int viTriBangDuocChon = cmboxDanhSachBang.layBangDuocChon();
				quanLyBang.veBang(this, viTriBangDuocChon);
				resetBangTaoBang();
				hienNutDuLieu();
			} else {
				JOptionPane.showMessageDialog(this, "Bảng vừa tạo bị rỗng !",
						"Lưu bảng bị lỗi", JOptionPane.WARNING_MESSAGE);
			}
		}

		/**
		 * Xử lý lưu xuống CSDL
		 */
		if (e.getActionCommand().equals("LuuCSDL")) {
			if (kiemTraDuLieuCacBang()) {
				DocLuuFile luuFile = new DocLuuFile(this,
						(JButton) e.getSource());
				String fileLocation = luuFile.getFileLocation();
				try {
					quanLyBang.luuCSDL(fileLocation);
				} catch (Exception e1) {
					JOptionPane.showMessageDialog(this, e1.toString(),
							"Lỗi lưu dữ liệu", JOptionPane.ERROR_MESSAGE);
				}
			} else {
				JOptionPane.showMessageDialog(this,
						"Dữ liệu không hợp lệ\nVui lòng kiểm tra lại",
						"Lỗi lưu dữ liệu", JOptionPane.ERROR_MESSAGE);
				getLblTrangThaiDuLieu().setText("Lỗi khi lưu dữ liệu");
			}
		}

		/**
		 * Xử lý khi đọc từ CSDl có sẵn
		 */
		if (e.getActionCommand().equals("DocCSDL")) {
			DocLuuFile docFile = new DocLuuFile(this, (JButton) e.getSource());
			String fileLocation = docFile.getFileLocation();
			try {
				quanLyBang.docCSDL(fileLocation);
				while (cmboxDanhSachBang.getDanhSachBang().getItemCount() > 0) // clear
																				// cmbox
																				// khi
																				// mở
																				// csdl
																				// mới
				{
					cmboxDanhSachBang.xoaBang(cmboxDanhSachBang
							.getDanhSachBang().getItemCount() - 1);
				}
				getCmboxDanhSachBang().themDanhSach(
						quanLyBang.layDanhSachBang());
				int viTriBangDuocChon = cmboxDanhSachBang.layBangDuocChon();
				quanLyBang.veBang(this, viTriBangDuocChon);

				if (cmboxDanhSachBang.danhSachRong())
					anNutDuLieu();
				else
					hienNutDuLieu();

			} catch (Exception e1) {
				// JOptionPane.showMessageDialog(this,
				// "Bạn đã hủy chọn mở dữ liệu", "Mở dữ liệu thất bại !",
				// JOptionPane.WARNING_MESSAGE);
			}
		}

		/**
		 * Xử lý khi xem kết quả các bảng vừa tạo ra
		 */
		if (e.getActionCommand().equals("XemKetQua")) {
			tabbedPane.setSelectedComponent(this.pnlDuLieu);
		}

		/**
		 * Xử lý khi hủy việc tạo bảng
		 */
		if (e.getActionCommand().equals("Huy")) {
			resetBangTaoBang();
		}

		if (e.getActionCommand().equals("NgatKetNoi")) {
			String value = getListDanhSachClients().layGiaTriPhanTuDuocChon();
			if (value == null) {
				JOptionPane.showMessageDialog(this,
						"Chọn một phần tử trong danh sách clients");
			} else {
				for (int i = 0; i < SocketServer.listClientWorker.size(); i++) {
					String temp = "Client ID : "
							+ SocketServer.listClientWorker.get(i).id;
					if (temp.equals(value)) {
						try {

							SocketServer.listClientWorker.get(i).ngatKetNoi();
						} catch (IOException e1) {
							// TODO Auto-generated catch block
							e1.printStackTrace();
						}
					}
				}
			}
		}
	}

	public boolean kiemTraDuLieuCacBang() {
		List<MyTable> danhSachCacBang = quanLyBang.layDanhSachCacBang();
		int soLuongBang = danhSachCacBang.size();

		for (int i = 0; i < soLuongBang; i++) {
			MyTable tempTable = quanLyBang.layBang(i);
			if (!tempTable.kiemTraDuLieu())
				return false;
		}

		return true;
	}

	/**
	 * Dùng để ẩn các nút khi thực hiện thao tác Hoàn tất hoặc Hủy tạo bảng
	 */
	private void resetBangTaoBang() {
		tfTenTruong.setEnabled(false);
		comboBoxKieuDuLieu.setEnabled(false);
		btnThemTruong.setEnabled(false);
		btnXoaTruong.setEnabled(false);
		btnHoanTat.setEnabled(false);
		btnHuyTaoBang.setEnabled(false);

		taTruongHienTai.setText("");
		lblTenBang.setText("");
		strTenBang = "";
		lblTenBang.setText(strTenBang);
		tfTenTruong.setText("");
		comboBoxKieuDuLieu.setSelectedIndex(0);
		chckbxKhoaChinh.setSelected(false);
	}

	/**
	 * Dùng để hiện thị các nút khi thực hiện thao tác Tạo bảng mới
	 */
	private void hienCacNut() {
		tfTenTruong.setEnabled(true);
		comboBoxKieuDuLieu.setEnabled(true);
		btnThemTruong.setEnabled(true);
		btnXoaTruong.setEnabled(true);
		btnHoanTat.setEnabled(true);
		btnHuyTaoBang.setEnabled(true);
		btnXemKetQua.setEnabled(true);
	}

	public void setIdClient(int idClient) {
		this.idClient = idClient;
	}

	/**
	 * @return the textAreaTrangThai
	 */
	public JTextArea getTextAreaTrangThai() {
		return textAreaTrangThai;
	}

	/**
	 * @param textAreaTrangThai
	 *            the textAreaTrangThai to set
	 */
	public void setTextAreaTrangThai(JTextArea textAreaTrangThai) {
		this.textAreaTrangThai = textAreaTrangThai;
		textAreaTrangThai.setFont(new Font("Monospaced", Font.PLAIN, 15));
		textAreaTrangThai.setLineWrap(true);
		textAreaTrangThai.setBackground(Color.BLACK);
		textAreaTrangThai.setEditable(false);
		textAreaTrangThai.setForeground(Color.GREEN);
	}

	/**
	 * Enabled các button bên panel Dữ Liệu
	 */
	public void hienNutDuLieu() {
		btnThemDong.setEnabled(true);
		btnXoaDong.setEnabled(true);
		btnLuu.setEnabled(true);
		btnXoaBang.setEnabled(true);
	}

	/**
	 * Dis Enabled các button bên panel Dữ Liệu
	 */
	public void anNutDuLieu() {
		btnThemDong.setEnabled(false);
		btnXoaDong.setEnabled(false);
		btnLuu.setEnabled(false);
		btnXoaBang.setEnabled(false);
	}

	public MyParser getMyParser() {
		return myParser;
	}

	public void setMyParser(MyParser myParser) {
		this.myParser = myParser;
	}

	/**
	 * Hàm xử lý truyền bảng kết qua khi nhận câu lệnh select
	 */
	public void xuLySelect() {

		MyTable myTable = null;
		Vector select = myParser.getSelect();
		Vector from = myParser.getFrom();
		if (myParser.getStatement().toString().toLowerCase()
				.contains("group by"))// select group by
		{
			ZGroupBy group = myParser.getGroupBy();
			myTable = quanLyBang.selectSQLCoGroupBy(select, from, group);
		} else {
			if (myParser.getStatement().toString().toLowerCase()
					.contains("where"))// select có where
			{
				ZExpression where = myParser.getWhere();
				myTable = quanLyBang.selectSQLCoWhere(select, from, where);
			} else
				// select không where
				myTable = quanLyBang.selectSQL(select, from);
		}

		if (myTable != null) {

			SocketServer.listClientWorker.get(idClient - 1).guiBangXML(myTable);
			getTextAreaTrangThai().append(
					"Đã gửi kết quả cho " + idClient + "\n");
		} else {
			SocketServer.listClientWorker.get(idClient - 1).guiTin(
					"Không tìm thấy bảng");
		}
	}

	/**
	 * Hàm xử lý truyền bảng kết qua khi nhận câu lệnh delete
	 */
	public void xuLyDelete() {
		Vector from = myParser.getFrom();
		ZExpression where = myParser.getWhere();

		String nameTable = from.get(0).toString();
		if (quanLyBang.deleteSQL(nameTable, where))
			SocketServer.listClientWorker.get(idClient - 1).guiTin(
					"Xóa thành công");
		else
			SocketServer.listClientWorker.get(idClient - 1).guiTin(
					"Xóa không thành công");
		getScrollHienBang().repaint();
	}

	/**
	 * Hàm xử lý truyền bảng kết qua khi nhận câu lệnh Insert
	 */
	public void xuLyInsert() {
		Vector from = myParser.getFrom();
		Vector value = myParser.getValue();
		if (from.size() == 1) {
			String nameTable = from.get(0).toString();
			if (quanLyBang.insertSQL(nameTable, value) == false)
				SocketServer.listClientWorker.get(idClient - 1).guiTin(
						"Insert không thành công");
			else
				SocketServer.listClientWorker.get(idClient - 1).guiTin(
						"Insert thành công");
			getScrollHienBang().repaint();
		}
		return;
	}

	/**
	 * Hàm xử lý truyền bảng kết qua khi nhận câu lệnh Update
	 */
	public void xuLyUpdate() {
		Vector from = myParser.getFrom();
		Hashtable ht = myParser.getSet();
		ZExpression where = myParser.getWhere();

		String nameTable = from.get(0).toString();
		if (quanLyBang.updateSQL(nameTable, ht, where))
			SocketServer.listClientWorker.get(idClient - 1).guiTin(
					"Update  thành công");
		else
			SocketServer.listClientWorker.get(idClient - 1).guiTin(
					"Update không thành công");
		getScrollHienBang().repaint();

	}

	public void xacNhanKetNoi() {
		SocketServer.listClientWorker.get(idClient - 1).guiTin("VanKetNoi");
	}

	/**
	 * @return the btnDocTuFile
	 */
	public JButton getBtnDocTuFile() {
		return btnDocTuFile;
	}

	/**
	 * @param btnDocTuFile
	 *            the btnDocTuFile to set
	 */
	public void setBtnDocTuFile(JButton btnDocTuFile) {
		this.btnDocTuFile = btnDocTuFile;
	}

	/**
	 * @return the btnLuu
	 */
	public JButton getBtnLuu() {
		return btnLuu;
	}

	/**
	 * @param btnLuu
	 *            the btnLuu to set
	 */
	public void setBtnLuu(JButton btnLuu) {
		this.btnLuu = btnLuu;
		btnLuu.setEnabled(false);
		btnLuu.setIcon(new ImageIcon(ServerGUI.class
				.getResource("/ImagesSource/rsz_save.png")));
		btnLuu.setToolTipText("Lưu xuống máy");
		btnLuu.setBounds(629, 125, 56, 46);
	}

	/**
	 * @return the scrollHienBang
	 */
	public JScrollPane getScrollHienBang() {
		return scrollHienBang;
	}

	/**
	 * @param scrollHienBang
	 *            the scrollHienBang to set
	 */
	public void setScrollHienBang(JScrollPane scrollHienBang) {
		this.scrollHienBang = scrollHienBang;
	}

	/**
	 * @return the cmboxDanhSachBang
	 */
	public DanhSachBang getCmboxDanhSachBang() {
		return cmboxDanhSachBang;
	}

	/**
	 * @param cmboxDanhSachBang
	 *            the cmboxDanhSachBang to set
	 */
	public void setCmboxDanhSachBang(DanhSachBang cmboxDanhSachBang) {
		this.cmboxDanhSachBang = cmboxDanhSachBang;
	}

	/**
	 * @return the luuDuongDan
	 */
	public String getLuuDuongDan() {
		return luuDuongDan;
	}

	/**
	 * @param luuDuongDan
	 *            the luuDuongDan to set
	 */
	public void setLuuDuongDan(String luuDuongDan) {
		this.luuDuongDan = luuDuongDan;
	}

	/**
	 * @return the lblTrangThaiDuLieu
	 */
	public JLabel getLblTrangThaiDuLieu() {
		return lblTrangThaiDuLieu;
	}

	/**
	 * @param lblTrangThaiDuLieu
	 *            the lblTrangThaiDuLieu to set
	 */
	public void setLblTrangThaiDuLieu(JLabel lblTrangThaiDuLieu) {
		this.lblTrangThaiDuLieu = lblTrangThaiDuLieu;
	}

	/**
	 * @return the listDanhSachClients
	 */
	public DanhSachClients getListDanhSachClients() {
		return listDanhSachClients;
	}

	/**
	 * @param listDanhSachClients
	 *            the listDanhSachClients to set
	 */
	public void setListDanhSachClients(DanhSachClients listDanhSachClients) {
		this.listDanhSachClients = listDanhSachClients;
	}
}
